class Solution {
public:
    int eatenApples(vector<int>& apples, vector<int>& days) {
        //使用一个最小堆+贪心来解决这道题目，将苹果和保质期使用pair放入到最小堆中，每一次都从堆顶中拿出，即将
        //到保质期的苹果，这样最后就能够得到我能吃苹果的最大数量了
        priority_queue<pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>>> que;
        int i = 0,ret = 0;//记录当前的天数，和能够吃苹果的最大数量
        for(;i<apples.size();i++)
        {
            while(!que.empty()&&que.top().first<=i)
            {
                que.pop();
            }//首先去除已经过期了的苹果
            //判断是否存在苹果
            if(apples[i]!=0)
            {
                //存在可以吃的苹果
                que.push(make_pair(i+days[i],apples[i]));
            }
            //到这里可以取出一个苹果然后进行吃了
            if(!que.empty())
            {
                ret++;
                auto [days,num] = que.top();
                que.pop();
                if(num>1)
                    que.emplace(days,num-1);
            }
        }
        //到这里可能，还有苹果我能够进行选择
        while(true)
        {
             while(!que.empty()&&que.top().first<=i)
            {
                que.pop();
            }
            if(que.empty())
            {
                return ret;
            }
            //选择可以吃的苹果
            auto [days,num] = que.top();
            que.pop();
            int k = min(num,days-i);//这里没准我有5个苹果但是只能支持三天了
            //或者没准我只有3个苹果但是保质期有5天，所以要选择最小的只
            i+=k;
            ret+=k;
        }
    }
};